package NarkyPackage;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

/**
 * Esta clase sirve para ser el detector de teclas del juego y registra que
 * teclas estan presionadas en un momento dado. Esto permite tener muchas
 * teclas presionadas al mismo tiempo, y no anda generando interrupciones
 * que como no son a intervalos regulares, hacen medio saltones o irresponsivos
 * a los controles.
 * 
 * @author GameTECH
 * @version 1.0
 *
 */
public class DetectorDeTeclas implements KeyListener {

	private int[] bufferDeTeclas;
	private int cantDeTeclasPresionadas;

	/**
	 * Crea un Detector de teclas con un buffer de teclas presionadas de
	 * tamano 5
	 */
	public DetectorDeTeclas() {
		bufferDeTeclas = new int[5];
		cantDeTeclasPresionadas = 0;
		for (int i = 0; i < bufferDeTeclas.length; i++) {
			bufferDeTeclas[i] = -1;
		}
	}
	
	/**
	 * Crea un Detector de teclas con un buffer de teclas presionadas de
	 * tamano l
	 * 
	 * @param l El tamano del buffer de teclas
	 */
	public DetectorDeTeclas(int l) {
		cantDeTeclasPresionadas = 0;
		bufferDeTeclas = new int[l];
		for (int i = 0; i < bufferDeTeclas.length; i++) {
			bufferDeTeclas[i] = -1;
		}
	}
	
	/**
	 * Registra que una tecla fue presionada
	 */
	public void keyPressed(KeyEvent e) {
		// Buscar si la tecla ya esta registrada
		for (int i = 0; i<bufferDeTeclas.length; i++) {
			if (e.getKeyCode() == bufferDeTeclas[i])
				return;
		}
		
		cantDeTeclasPresionadas++;

		//Si no encontro, la agrega en el primer espacio disponible
		for (int i = 0; i<bufferDeTeclas.length; i++) {
			if (bufferDeTeclas[i] == -1) {
				bufferDeTeclas[i] = e.getKeyCode();
				return;
			}
		}
		
		//Si no encontro espacios disponibles manda a ampliar el buffer
		expandirArreglo();
		//y lo pone en el recien creado
		bufferDeTeclas[bufferDeTeclas.length - 3] = e.getKeyCode();
	}

	/**
	 * Aumenta el tamano del buffer para que le quepan 3 teclas mas.
	 */
	private void expandirArreglo() {
		int[]viejoBuffer = bufferDeTeclas;
		bufferDeTeclas = new int[viejoBuffer.length + 3];
		for (int i = 0; i < bufferDeTeclas.length; i++) {
			if (i < viejoBuffer.length)
				bufferDeTeclas[i] = viejoBuffer[i];
			else
				bufferDeTeclas[i] = -1;
		}
	}

	/**
	 * Registra que se solto una tecla.
	 */
	public void keyReleased(KeyEvent e) {
		for (int i = 0; i<bufferDeTeclas.length; i++) {
			if (bufferDeTeclas[i] == e.getKeyCode()) {
				bufferDeTeclas[i] = -1;
				cantDeTeclasPresionadas--;
			}
		}

	}
	
	/**
	 * Metodo para checar si esta presionada una tecla en especifico
	 * 
	 * @param keyCode  El keyCode de la tecla que se quiere checar
	 * @return         Si esa tecla esta presionada o no
	 */
	public boolean estaPresionada(int keyCode) {
		
		if (!hayTeclasPresionadas())
			return false;
		
		for (int i = 0; i < bufferDeTeclas.length; i++) {
			if (bufferDeTeclas[i] == keyCode)
				return true;
		}
		return false;
	}

	/**
	 * Metodo para checar si hay teclas que estan siendo presionadas.
	 * 
	 * @return <code>true</code> si hay una o mas teclas presionadas
	 */
	public boolean hayTeclasPresionadas() {
		return cantDeTeclasPresionadas > 0;
	}
	
	public void keyTyped(KeyEvent e) {
		// metodo vacio

	}

}
